home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 2000 #5 / Amiga Plus CD - 2000 - No. 5.iso / Tools / Dev / lame_src / rtp.c < prev    next >
C/C++ Source or Header  |  2000-01-01  |  3KB  |  103 lines

  1. #include <stdlib.h>
  2. #include <string.h>
  3. #include <netinet/in.h>
  4. #include <unistd.h>
  5. #include <stdlib.h>
  6. #include <stdio.h>
  7. #include <sys/types.h>
  8. #include <sys/socket.h>
  9. #include <arpa/inet.h>
  10.  
  11. struct rtpbits {
  12.   int sequence:16;    /* sequence number: random */
  13.   int pt:7;    /* payload type: 14 for MPEG audio */
  14.   int m:1;    /* marker: 0 */
  15.   int cc:4;    /* number of CSRC identifiers: 0 */
  16.   int x:1;    /* number of extension headers: 0 */
  17.   int p:1;    /* is there padding appended: 0 */
  18.   int v:2;    /* version: 2 */
  19. };
  20.  
  21. struct rtpheader {    /* in network byte order */
  22.   struct rtpbits b;
  23.   int timestamp;    /* start: random */
  24.   int ssrc;        /* random */
  25.   int iAudioHeader;    /* =0?! */
  26. };
  27.  
  28. void initrtp(struct rtpheader *foo) {
  29.   foo->b.v=2;
  30.   foo->b.p=0;
  31.   foo->b.x=0;
  32.   foo->b.cc=0;
  33.   foo->b.m=0;
  34.   foo->b.pt=14;        /* MPEG Audio */
  35. #ifdef FEFE
  36.   foo->b.sequence=42;
  37.   foo->timestamp=0;
  38. #else
  39.   foo->b.sequence=rand() & 65535;
  40.   foo->timestamp=rand();
  41. #endif
  42.   foo->ssrc=rand();
  43.   foo->iAudioHeader=0;
  44. }
  45.  
  46. int sendrtp(int fd, struct sockaddr_in *sSockAddr, struct rtpheader *foo, void *data, int len) {
  47.   char *buf=alloca(len+sizeof(struct rtpheader));
  48.   int *cast=(int *)foo;
  49.   int *outcast=(int *)buf;
  50.   outcast[0]=htonl(cast[0]);
  51.   outcast[1]=htonl(cast[1]);
  52.   outcast[2]=htonl(cast[2]);
  53.   outcast[3]=htonl(cast[3]);
  54.   memmove(buf+sizeof(struct rtpheader),data,len);
  55.   return sendto(fd,buf,len+sizeof(*foo),0,(struct sockaddr *)sSockAddr,sizeof(*sSockAddr));
  56. /*  return write(fd,buf,len+sizeof(*foo))==len+sizeof(*foo); */
  57. }
  58.  
  59. /* create a sender socket. */
  60. int makesocket(char *szAddr,unsigned short port,int TTL,struct sockaddr_in *sSockAddr) {
  61.   int          iRet, iLoop = 1;
  62.   struct       sockaddr_in sin;
  63.   char         cTtl = (char)TTL;
  64.   char         cLoop=0;
  65.   unsigned int tempaddr;
  66.  
  67.   int iSocket = socket( AF_INET, SOCK_DGRAM, 0 );
  68.   if (iSocket < 0) {
  69.     fprintf(stderr,"socket() failed.\n");
  70.     exit(1);
  71.   }
  72.  
  73.   tempaddr=inet_addr(szAddr);
  74.   sSockAddr->sin_family = sin.sin_family = AF_INET;
  75.   sSockAddr->sin_port = sin.sin_port = htons(port);
  76.   sSockAddr->sin_addr.s_addr = tempaddr;
  77.  
  78.   iRet = setsockopt(iSocket, SOL_SOCKET, SO_REUSEADDR, &iLoop, sizeof(int));
  79.   if (iRet < 0) {
  80.     fprintf(stderr,"setsockopt SO_REUSEADDR failed\n");
  81.     exit(1);
  82.   }
  83.  
  84.   if ((ntohl(tempaddr) >> 28) == 0xe) {
  85.     /* only set multicast parameters for multicast destination IPs */
  86.     iRet = setsockopt(iSocket, IPPROTO_IP, IP_MULTICAST_TTL, &cTtl, sizeof(char));
  87.     if (iRet < 0) {
  88.       fprintf(stderr,"setsockopt IP_MULTICAST_TTL failed.  multicast in kernel?\n");
  89.       exit(1);
  90.     }
  91.  
  92.     cLoop = 1;    /* !? */
  93.     iRet = setsockopt(iSocket, IPPROTO_IP, IP_MULTICAST_LOOP,
  94.               &cLoop, sizeof(char));
  95.     if (iRet < 0) {
  96.       fprintf(stderr,"setsockopt IP_MULTICAST_LOOP failed.  multicast in kernel?\n");
  97.       exit(1);
  98.     }
  99.   }
  100.  
  101.   return iSocket;
  102. }
  103.